// IAidlInterface.aidl
package com.fzx.aidlservice;

import com.fzx.aidlservice.bean.UserInfo;
import com.fzx.aidlservice.callback.ICallBack;
import com.fzx.aidlservice.callback.IObserversCallBack;
/*客户端*/
//注意：
//接口中定义的方法名称一定不能一样，即便是参数不一样，方法名称也要不一样
//客户端和服务端中定义的方法可以不一样，只是那样没意义，所以定义的方法一般都一样，可以按需求增减，
//方法的参数是其他定义的类型，需要实现Parcelable，参数前需要添加定向tag，如：in
//使用Android Studio构建时，客户端和服务端都需要在Module下的build.gradle文件中android标签下
//增加sourceSets { main { java.srcDirs = ['src/main/java', 'src/main/aidl'] } }
//支持使用的类型：
//1.基本类型int ,short , long , byte , char , Boolean , float ,double
//2.String和CharSequence类型
//3.传递数组，无论类型都要在参数前添加 in
//4.自定义Bean类实现Parcelable，还需要在同目录下定义一个同名的aidl文件，里面定义parcelable 类名即可
//5.List集合类型：测试不能直接传递ArrayList；测试可以传递List
//6.Map集合类型：测试不能直接传递HashMap<String,String>，测试可以传递Map
//7.AIDL使用回调
//定向tag：in、out、inout，in表示数据只能从客户端流向服务端。out表示数据只能从服务端流向客户端。inout可以双向流动，inout使用比较消耗系统资源
//目前还不知道怎么使用out和inout（参考：https://blog.csdn.net/jdqm2014/article/details/78264731）
//in：客户端传递in对象参数时，服务端获取到参数，在服务端修改参数时，客户端不会修改
//out：客户端传递out对象参数时，服务端并没有获取到参数，而是自己重新创建对象，这个对象必须有空参构造函数，在服务端修改了参数，客户端也被修改了
//inout：客户端传递inout对象参数时，服务端获取到参数，服务端修改参数时，客户端同样会发生改变
//注意：使用AIDL多进程会导致几个问题
//  1.静态成员和单列模式完全失效
//  2.线程同步机制失效
//  3.SharePreferenced的可靠性下降
//  4.Application多次创建
interface IAidlInterface {

    int add(int a,int b);
    String getString(String res);
    CharSequence getCharSequence(CharSequence ch);
    void gotoSetting();
    //自定义类
    void setUserInfo(in UserInfo info);//in、out、inout
    UserInfo getUserInfo();
    //数组
    void setArrayData(in String[] arr);
    String[] getArrayData();
    //传递list集合需要在参数前加in，测试不能传递ArrayList
    void setDataList(in List<String> list);
    List<String> getDataList();
    //传递带自定义类型参数的List
    void setUserList(in List<UserInfo> userList);
    List<UserInfo> getUserList();
    //传递Map
    void setMap(in Map map);
    Map getMap();
    //回调
    void testCallback(in ICallBack callback);
    //服务端主动上报
    void register(in IObserversCallBack callback);
    void unregister(in IObserversCallBack callback);
    //定向指标in、out、inout
    void testin(in UserInfo info);
    void testout(out UserInfo info);
    void testinout(inout UserInfo info);

    void clearServiceData();
    void setFunc();//仅测试
}
